import { defineStore } from 'pinia';
import router from '@/routers/index';
import { ref } from 'vue';

/**
 * 标签视图管理Store
 * @description 用于管理页面标签视图的打开、关闭和切换
 * @author 系统
 * @version 1.0.0
 * @since 2024-01-01
 */
export const useTagsViewStore = defineStore('tagsViewState', () => {
  /**
   * 当前激活的标签页路径
   * @type {import('vue').Ref<string>}
   * @description 当前选中的标签页路由路径
   */
  const activeTabsValue = ref('/home');

  /**
   * 已访问的视图列表
   * @type {import('vue').Ref<any[]>}
   * @description 存储所有已打开的页面标签信息
   */
  const visitedViews = ref([]);

  /**
   * 缓存的视图列表
   * @type {import('vue').Ref<any[]>}
   * @description 存储需要keep-alive缓存的页面组件名称
   */
  const cachedViews = ref([]);

  /**
   * 设置标签菜单值
   * @param {string} val - 标签页路径
   * @description 设置当前激活的标签页
   */
  const setTabsMenuValue = val => {
    activeTabsValue.value = val;
  };

  /**
   * 添加视图
   * @param {Object} view - 视图对象
   * @description 添加新的页面标签到已访问列表
   */
  const addView = view => {
    addVisitedView(view);
  };

  /**
   * 移除视图
   * @param {string[]} routes - 路由路径数组
   * @returns {Promise<null>} 空Promise
   * @description 从已访问列表中移除指定的路由页面
   */
  const removeView = async routes => {
    visitedViews.value = visitedViews.value.filter(item => !routes.includes(item.path));
    return null;
  };

  /**
   * 添加已访问视图
   * @param {Object} view - 视图对象
   * @description 添加页面到已访问列表并更新缓存
   */
  const addVisitedView = view => {
    setTabsMenuValue(view.path);
    if (visitedViews.value.some(v => v.path === view.path)) return;

    visitedViews.value.push(Object.assign({}, view, { title: view.meta.title || 'no-name' }));
    if (view.meta.keepAlive) {
      cachedViews.value.push(view.name);
    }
  };

  /**
   * 删除视图
   * @param {string} activeTabPath - 激活的标签页路径
   * @returns {Promise<Object>} 删除后的视图列表
   * @description 删除指定的页面标签
   */
  const delView = async activeTabPath => {
    await delVisitedView(activeTabPath);
    await delCachedView(activeTabPath);
    return {
      visitedViews: [...visitedViews.value],
      cachedViews: [...cachedViews.value]
    };
  };

  /**
   * 跳转到最后一个视图
   * @param {string} activeTabPath - 激活的标签页路径
   * @description 在当前标签关闭后跳转到相邻的标签页
   */
  const toLastView = activeTabPath => {
    const index = visitedViews.value.findIndex(item => item.path === activeTabPath);
    const nextTab = visitedViews.value[index + 1] || visitedViews.value[index - 1];
    if (!nextTab) return;
    router.push(nextTab.path);
    addVisitedView(nextTab);
  };

  /**
   * 删除已访问视图
   * @param {string} path - 路由路径
   * @returns {Promise<any[]>} 删除后的已访问视图列表
   * @description 从已访问列表中删除指定路径的页面
   */
  const delVisitedView = async path => {
    visitedViews.value = visitedViews.value.filter(v => v.path !== path || v.meta.affix);
    cachedViews.value = cachedViews.value.filter(v => v.path !== path || v.meta.affix);
    return [...visitedViews.value];
  };

  /**
   * 删除缓存视图
   * @param {Object} view - 视图对象
   * @returns {Promise<any[]>} 删除后的缓存视图列表
   * @description 从缓存列表中删除指定的页面组件
   */
  const delCachedView = async view => {
    const index = cachedViews.value.indexOf(view.name);
    index > -1 && cachedViews.value.splice(index, 1);
    return [...cachedViews.value];
  };

  /**
   * 清空已访问视图
   * @description 清空所有已访问的页面标签（保留固定标签）
   */
  const clearVisitedView = () => {
    delAllViews();
  };

  /**
   * 删除所有视图
   * @returns {Promise<any[]>} 删除后的已访问视图列表
   * @description 删除所有非固定的页面标签
   */
  const delAllViews = async () => {
    visitedViews.value = visitedViews.value.filter(v => v.meta.affix);
    cachedViews.value = visitedViews.value.filter(v => v.meta.affix);
    return [...visitedViews.value];
  };

  /**
   * 删除其他视图
   * @param {string} path - 路由路径
   * @description 删除除指定路径外的所有非固定页面标签
   */
  const delOtherViews = path => {
    visitedViews.value = visitedViews.value.filter(item => item.path === path || item.meta.affix);
    cachedViews.value = visitedViews.value.filter(item => item.path === path || item.meta.affix);
  };

  /**
   * 返回首页
   * @description 跳转到首页并激活首页标签
   */
  const goHome = () => {
    activeTabsValue.value = '/home';
    router.push({ path: '/home' });
  };

  /**
   * 更新已访问视图
   * @param {Object} view - 视图对象
   * @description 更新已访问列表中指定页面的信息
   */
  const updateVisitedView = view => {
    for (let v of visitedViews.value) {
      if (v.path === view.path) {
        v = Object.assign(v, view);
        break;
      }
    }
  };

  // 返回所有状态和方法
  return {
    // 状态
    activeTabsValue,
    visitedViews,
    cachedViews,

    // 方法
    setTabsMenuValue,
    addView,
    removeView,
    addVisitedView,
    delView,
    toLastView,
    delVisitedView,
    delCachedView,
    clearVisitedView,
    delAllViews,
    delOtherViews,
    goHome,
    updateVisitedView
  };
});
